package JunitDemo;

import com.beust.jcommander.Parameter;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;
import org.openqa.selenium.By;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;

import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Stream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-04-09
 * Time: 11:22
 */

//@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 指定按照 Order进行排序
public class JunitDemo3 {

//    @Order(1)  // @Order 只指明了执行顺序, 并不能让其成为执行用例
//    public void fun1() {
//        System.out.println("方法1");
//    }
//    @Order(2)
//    public void fun2() {
//        System.out.println("方法2");
//    }
//
//    @Order(3)
//    public void fun3() {
//        System.out.println("方法3");
//    }
//
//    @Order(4)
//    public void fun4() {
//        System.out.println("方法4");
//    }
//
//    @Order(5)
//    public void fun5() {
//        System.out.println("方法5");
//    }

//    @ParameterizedTest
//    @CsvSource({"zhangsan,123","lisi, 123","wangwu, 123"}) // 提供 多个 参数数据来源
//    public void login(String name, String password) {
//        EdgeOptions options = new EdgeOptions();
//        options.addArguments("--remote-allow-origins=*");
//        EdgeDriver driver = new EdgeDriver(options);
//
//        driver.get("http://124.221.91.27:8080/My_blog_System/login.html");
//        driver.findElement(By.cssSelector("#username")).sendKeys("1843977391");
//        driver.findElement(By.cssSelector("#password")).sendKeys("lyf2021.");
//        driver.findElement(By.cssSelector("#submit")).click();
//
//        driver.quit();
//    }

//    @ParameterizedTest
//    @CsvSource({"张三, 10, 男", "李四, 20, 女"})  // 每个双引号就是一组
//    public void parameter1(String name, int age, String sex) {
//        System.out.println("姓名:" + name + "年龄:" + age + "性别:" + sex);
//    }

//    @ParameterizedTest
//    // 传一份多参数的文件
//    @CsvFileSource(files = "E:\\Javacode\\auto-test-java\\AutoTest0406\\message.csv")
//    void csvParameter(String name, int age, String sex) {
//          System.out.println("姓名:" + name + "年龄:" + age + "性别:" + sex);
//    }



//    @ParameterizedTest // 强调该方法为参数化方法
//    @ValueSource(strings = {"zhangsan", "lisi"}) // 只能提供 单个 参数来源
//    // 数据类型方法为小写 strings shorts bytes ....
//    void parameter(String name) {
//
//        System.out.println("这是一个参数化方法, 参数为:" + name);
//    }


    @ParameterizedTest
//    @MethodSource("supportSource") // 提供方法源的数据来源
    @MethodSource // 当方法名和提供数据的方法名一致时, 注解里的数据源方法名可以不写
    void supportSource(String name, int age) {
        System.out.println("姓名:" + name + "  年龄:" + age);
    }

    // 提供数据的数据源方法必须是静态方法
    // 需要的数据类型是多种数据类型, 使用组合类型 Argument , 若单一 如 String 则为String
    static Stream<Arguments> supportSource() throws InterruptedException {
        String[] arr = new String[5];
        for (int i = 0; i < arr.length; i++) {
            Thread.sleep(2000);
            arr[i] = String.valueOf(System.currentTimeMillis());
        }

        return Stream.of(
                Arguments.arguments(arr[0], 20),
                Arguments.arguments(arr[1], 20),
                Arguments.arguments(arr[2], 20),
                Arguments.arguments(arr[3], 20),
                Arguments.arguments(arr[4], 20)
                );
    }

    @ParameterizedTest
    // csv 文件中, 以一行为单位, 只有一个参数则读取一行中的第一个. 有三个参数则读取一行中的三个参数. 位置强相关
    // 一行结束代表第一组测试用例结束
    // 只能和读取 resource 底下的 csv 文件, 并且该测试类要和这段测试代码在同一个包下 ( 比如 main 包下 )
    @CsvFileSource(resources = "test01.csv")
    void test02(String name1, String name2, String name3 ) {
        System.out.println(name1 +" " + name2 +" "+ name3);
    }
}
